package Java基础.IO流.how2j;

import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.IOException;
import java.util.Date;

/**
 * Created by didi on 18/01/2018.
 */
public class _1文件对象 {

    public final static String ROOT_DIR = "f:/testFile";
    public final static String RELATIVE_EXE_FILE = "testFile.exe";

    /**
     * 使用File的构造函数
     */
    @Test
    void test(){
        // 绝对路径
        File f1 = new File(ROOT_DIR);
        System.out.println("f1的绝对路径：" + f1.getAbsolutePath());
        // 相对路径,相对于工作目录，如果在idea中，就是项目根目录"E:\idea_2016\JavaSE"
        File f2 = new File(RELATIVE_EXE_FILE);
        System.out.println("f2的绝对路径：" + f2.getAbsolutePath());
        // 把f1作为父目录创建文件对象
        File f3 = new File(f1, "LOL.exe");
        System.out.println("f3的绝对路径：" + f3.getAbsolutePath());
    }

    /**
     * 打印文件信息.
     * > 该文件必须真实存在,才能有相应的信息.
     */
    @Test
    void test2(){
        File f = new File(RELATIVE_EXE_FILE);
        System.out.println("当前文件是：" +f);
        //文件绝对路径
        System.out.println("文件绝对路径:"+f.getAbsolutePath());
        //文件是否存在
        System.out.println("判断是否存在："+f.exists());
        //是否是文件夹
        System.out.println("判断是否是文件夹："+f.isDirectory());
        //是否是文件（非文件夹）
        System.out.println("判断是否是文件："+f.isFile());
        //文件长度
        System.out.println("获取文件的长度："+f.length());
        //文件最后修改时间
        long time = f.lastModified();
        Date d = new Date(time);
        System.out.println("获取文件的最后修改时间："+d);
        //设置文件修改时间为1970.1.1 08:00:00
        f.setLastModified(0);
        //文件重命名
//        File f2 =new File("d:/LOLFolder/DOTA.exe");
//        f.renameTo(f2);
//        System.out.println("把LOL.exe改名成了DOTA.exe");
//        System.out.println("注意： 需要在D:\\LOLFolder确实存在一个LOL.exe,\r\n才可以看到对应的文件长度、修改时间等信息");
    }

    /**
     * 1. 获取直接后代的信息, 字符串[] 或 File[]
     * 2. 获取父目录, 字符串 或 File
     */
    @Test
    void test22() throws IOException {
        File f = new File("F:/testFile");

        // 以字符串数组的形式，返回当前文件夹下的所有文件和文件夹的名字（不包含子文件及子文件夹）
        String[] fileStringArray  = f.list();
        for (String fstr : fileStringArray){
            System.out.println(fstr);
        }

        // 以文件数组的形式，返回当前文件夹下的所有File对象(文件和文件夹)（不包含子文件及子文件夹）
        File[] listFiles= f.listFiles();
        for(File ff : listFiles){
            System.out.println(ff);
        }

        // 以字符串形式返回获取所在文件夹
        String parent = f.getParent();
        System.out.println(parent);

        // 以文件形式返回获取所在文件夹
        File parentFile = f.getParentFile();
        System.out.println(parentFile);
    }

    /**
     * 创建或删除文件
     */
    @Test
    void test333() throws IOException {
        File f = new File("F:/testFile");

        // 创建文件夹，如果父目录不存在，创建就无效
        f.mkdir();

        // 创建文件夹，包括任意不存在的父目录,都会一起创建
        f.mkdirs();

        // 创建一个空文件,如果父目录不存在，就会抛出异常
        f.createNewFile();
        // 所以创建一个空文件之前，通常都会创建父目录
        f.getParentFile().mkdirs();

        // 刪除文件 //删除文件夹(文件夹必须为空)
        f.delete();

        // JVM结束的时候，刪除文件，常用于临时文件的删除
        f.deleteOnExit();
    }

    @Test
    void test33(){
        // 列出所有的盘符c: d: e: 等等
        File.listRoots();
    }

    /**
     * Q: abstract pathname?
     * getCanonicalPath(): Returns the canonical pathname string of this abstract pathname.
     * @throws IOException
     */
    @Test
    void test3() throws IOException {
        File f = new File("");
        System.out.println(f.getCanonicalPath());
        File f1 = new File(RELATIVE_EXE_FILE);
        System.out.println(f1.getCanonicalPath());
    }

}
